package model

import (
	"time"

	"bilinadmin/pkg/util"
)

const (
	// MsgStatusWaiting 等待发送
	MsgStatusWaiting int8 = 1
	// MsgStatusPublished 发送成功
	MsgStatusPublished int8 = 2
	// MsgStatusAborted 废弃
	MsgStatusAborted int8 = 3

	MsgTypeForSending   int8 = 1
	MsgTypeForConsuming int8 = 2
)

// Message 消息
type Message struct {
	// id
	Id int64 `json:"id" sql:"id"`
	// 消息 topic
	Topic string `json:"topic" sql:"topic"`
	// 消息内容
	Content []byte `json:"content" sql:"content"`
	// 状态
	Status int8 `json:"status" sql:"status"`
	// 重试次数
	RetryCount int8 `json:"retry_count" sql:"retry_count"`
	// 消息类型
	MsgType int8 `json:"msg_type" sql:"msg_type"`
	// 创建时间
	CreatedAt time.Time `json:"created_at" sql:"created_at"`
	// 更新时间
	UpdatedAt time.Time `json:"updated_at" sql:"updated_at"`
	// 预期发送时间
	Eta time.Time `json:"eta" sql:"eta"`
}

// NewMessage 新建消息
func NewMessage(topic string, content interface{}, msgType int8) *Message {
	var conB []byte
	switch content.(type) {
	case []byte:
		conB = content.([]byte)
	default:
		conB, _ = json.Marshal(content)
	}
	now := util.GetNow()
	return &Message{
		Topic:     topic,
		Content:   conB,
		Status:    MsgStatusWaiting,
		MsgType:   msgType,
		CreatedAt: now,
		UpdatedAt: now,
		Eta:       now,
	}
}

// SetEta 设置预期发送时间
func (m *Message) SetEta(eta time.Time) {
	if !eta.IsZero() {
		m.Eta = eta
		m.UpdatedAt = util.GetNow()
	}
}

// SendFailed 发送失败
func (m *Message) SendFailed() {
	m.Status = MsgStatusWaiting
	m.RetryCount += 1
	m.UpdatedAt = util.GetNow()
}

// SendOk 发送成功
func (m *Message) SendOk() {
	m.Status = MsgStatusPublished
	m.RetryCount += 1
	m.UpdatedAt = util.GetNow()
}

// Abort 废弃
func (m *Message) Abort() {
	m.Status = MsgStatusAborted
	m.UpdatedAt = util.GetNow()
}
